(* 3911696 *)
MODULE CalcMat;

FROM InOut 	IMPORT WriteLn, WriteString;
FROM Matriz 	IMPORT CrearMatriz, Matriz, ImprimirMatriz, DestruirMatriz,
			ObtenerDimensionMatriz;
FROM OpMatriz	IMPORT RotacionPorFila, SumarNatural, Traspuesta;
FROM Strings 	IMPORT Equal;
FROM Comando 	IMPORT  LeerComando, Comando, NombreComando, ObtenerNombreComando,
			ObtenerParamComando, DestruirComando, COMANDO_CREAR,
			COMANDO_SALIR, COMANDO_SUMAR, COMANDO_ROTAR,
			COMANDO_TRASPUESTA, COMANDO_IMPRIMIR;
FROM WholeStr	IMPORT StrToCard, ConvResults;

VAR
	cmd : Comando;
	cmdName : NombreComando;
	matriz : Matriz;
	existeMatriz : BOOLEAN;
(*************************************************)
(************* PROCEDURES AUXILIARES *************)
(*************************************************)
PROCEDURE crearMatriz(cmd : Comando);
VAR
	res : ConvResults;
	Dimension : CARDINAL;
BEGIN
	StrToCard(ObtenerParamComando(1, cmd), Dimension, res);
	matriz := CrearMatriz(Dimension); 		
END crearMatriz;

(*************************************************)
PROCEDURE rotar(cmd : Comando);
VAR
	res : ConvResults;
	rotar, param : CARDINAL;
BEGIN
	StrToCard(ObtenerParamComando(1, cmd), param, res);
	rotar := param MOD ObtenerDimensionMatriz(matriz);
	(* rotar := 7 MOD 4 = 3 *)
	RotacionPorFila(rotar, matriz);		
END rotar;

(*************************************************)
PROCEDURE sumar(cmd : Comando);
VAR
	res : ConvResults;
	natural : CARDINAL;
BEGIN
	StrToCard(ObtenerParamComando(1, cmd), natural, res);
	SumarNatural(natural, matriz);	 		
END sumar;

(*************************************************)
(************** PROGRAMA PRINCIPAL ***************)
(*************************************************)
BEGIN
	(* Booleano para determinar si fue creada o aun no la matriz *)
	existeMatriz := FALSE;
	WriteString("Bienvenidos a CalcMat");
	WriteLn();
	WriteString("version 1.0");
	WriteLn();
	WriteString("InCo-FING-UdelaR");
	WriteLn();
	WriteLn();
	WriteString(">");
	
	cmd := LeerComando();
	cmdName := ObtenerNombreComando(cmd);
	
	WHILE (NOT Equal(cmdName, COMANDO_SALIR) ) DO
	
		IF (Equal(cmdName, COMANDO_CREAR)) THEN
			IF existeMatriz THEN
				DestruirMatriz(matriz);
			END;
			crearMatriz(cmd);
			existeMatriz := TRUE;
			WriteLn();
		END;
		
		IF (Equal(cmdName, COMANDO_SUMAR)) THEN
			IF existeMatriz THEN
				sumar(cmd);
				WriteLn();
			END;
		END;
		
		IF (Equal(ObtenerNombreComando(cmd), COMANDO_ROTAR)) THEN
			IF existeMatriz THEN
				rotar(cmd);
				WriteLn();
		END;    END;
		
		IF (Equal(cmdName, COMANDO_TRASPUESTA)) THEN
			IF existeMatriz THEN
				Traspuesta(matriz);
				WriteLn();
		END;    END;
		
		IF (Equal(cmdName, COMANDO_IMPRIMIR)) THEN
			IF existeMatriz THEN
				ImprimirMatriz(matriz);
			END;
		END;
				
		WriteString(">");
		cmd := LeerComando();
		cmdName := ObtenerNombreComando(cmd);
	END;
	DestruirMatriz(matriz);
	DestruirComando(cmd);
	WriteString("Fin!");
	
END CalcMat.